package tech.aistar.day10;

/**
 * 本类用来演示: Thread和Runnable区别
 *
 * @author: success
 * @date: 2022/8/1 9:24 上午
 */
public class DiffThreadAndRunnable {
    public static void main(String[] args) {
        //Thread t1 = new T1();
        //Thread t2 = new T1();
        //
        //t1.setName("窗口1");
        //t2.setName("窗口2");
        //
        //t1.start();
        //t2.start();

        Runnable r1 = new T2();//仅仅只初始化了一次
        //Runnable r2 = new T2();//仅仅只初始化了一次
        Thread t1 = new Thread(r1);
        Thread t2 = new Thread(r1);
        t1.start();
        t2.start();
    }
}
@SuppressWarnings("all")
class T1 extends Thread{
    //定义一个非静态属性 - 属于对象的 - Thread=>共享代码,但是没有共享资源
    private int ticket = 10;
    //private static int ticket = 10; // 内存中的实例仅仅只有1份. 类变量 - 对象可以共享的变量

    @Override
    public void run() {
        for (int i = 10; i >=1 ; i--) {
            if(ticket>0) {
                //体现俩个线程交替执行  - 并发
                try {
                    //程序睡1s,避免某个线程一瞬间将循环全部执行完毕
                    //让出cpu的执行权限,cpu可能又会再次调度你的.
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "正在卖票,剩余:" + (--ticket));
            }
        }
    }
}
@SuppressWarnings("all")
class T2 implements Runnable{
    private int ticket = 10;

    @Override
    public void run() {
        for (int j = 10; j >=1 ; j--) {
            if(ticket>0) {
                //体现俩个线程交替执行  - 并发
                try {
                    //程序睡1s,避免某个线程一瞬间将循环全部执行完毕
                    //让出cpu的执行权限,cpu可能又会再次调度你的

                    //一个线程如果进入到睡眠,cpu让出去干其他事情
                    //但是睡眠时间一到,会正常继续执行的.
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "正在卖票,剩余:" + (--ticket));
            }
        }
    }
}